﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;

namespace RPGMapa.Data
{
    /// <summary>
    /// Classe responsavel por encapsular uma imagem Tileset.
    /// </summary>
    public class ImgMatrix
    {
        Bitmap bmp;
        private int numberX, numberY;
        private int offX, offY; // tamanho dos quadrados do tile set.

        /// <summary>
        /// Cria uma nova instancia de ImgMatrix.
        /// </summary>
        /// <param name="imagem">Imagem principal (tileset).</param>
        /// <param name="NumberOfSubImagesX">Número de sub imagens no eixo X.</param>
        /// <param name="NumberOfSubImagesY">Número de sub imagens no eixo Y.</param>
        public ImgMatrix(Bitmap imagem, int NumberOfSubImagesX, int NumberOfSubImagesY)
        {
            this.bmp = imagem;
            this.NumberX = NumberOfSubImagesX;
            this.NumberY = NumberOfSubImagesY;
            // Quando atualizar o NumberX e Y, ele automaticamente atualiza os Offsets.
        }

        /// <summary>
        /// Retorna uma sub imagem localizada nas seguintes coordenadas.
        /// </summary>
        /// <param name="x">Coordenada X da sub imagem.</param>
        /// <param name="y">Coordenada Y da sub imagem.</param>
        /// <returns></returns>
        public Bitmap this[int x, int y]
        {
            get
            {
                offX = Width / numberX;
                offY = Height / numberY;
                Bitmap output = new Bitmap(offX, offY, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
                Graphics g = Graphics.FromImage(output);
                g.DrawImageUnscaledAndClipped(bmp, new Rectangle(-(x * offX), -(y * offY), Width, Height));
                return output;
            }
        }

        public Bitmap this[Vector2 v]
        {
            get { return this[v.X, v.Y]; }
        }

        public static ImgMatrix DefautTileset()
        {
            return new ImgMatrix(Properties.Resources.Tileset, 24, 15);
        }

        #region Propiedades
        /// <summary>
        /// Imagem principal na qual é estraida as sub imagens.
        /// </summary>
        public Bitmap Tileset
        {
            get { return bmp; }
            set { bmp = value; }
        }

        /// <summary>
        /// Largura da imagem principal (tileset).
        /// </summary>
        public int Width
        {
            get { return bmp.Width; }
        }

        /// <summary>
        /// Altura da imagem principal (tileset).
        /// </summary>
        public int Height
        {
            get { return bmp.Height; }
        }


        /// <summary>
        /// Altura (height) de cada imagem. Readonly.
        /// </summary>
        public int OffY
        {
            get { return offY; }
        }

        /// <summary>
        /// Largura (width) de cada imagem. Readonly.
        /// </summary>
        public int OffX
        {
            get { return offX; }
        }

        /// <summary>
        /// Número de sub imagems no eixo Y.
        /// </summary>
        public int NumberY
        {
            get { return numberY; }
            set
            {
                numberY = value;
                offY = Height / numberY;
            }
        }

        /// <summary>
        /// Número de sub imagens no eixo X.
        /// </summary>
        public int NumberX
        {
            get { return numberX; }
            set
            {
                numberX = value;
                offX = Width / numberX;
            }
        }
        #endregion
    }
}
